package br.com.news.web;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.richfaces.event.FileUploadEvent;
import org.richfaces.model.UploadedFile;

import br.com.news.utils.database.beans.CategoriaBean;
import br.com.news.utils.database.beans.FonteBean;
import br.com.news.utils.database.beans.NoticiaBean;
import br.com.news.utils.database.beans.enums.Perfil;
import br.com.news.utils.interfaces.Constantes;
import br.com.news.web.annotations.Permission;
import br.com.news.web.session.UserSession;
import br.com.news.web.utils.ObjetoDownload;

/**
 * ManagedBean para fazer o GRUD das Noticias
 * 
 * @author Jefferson
 * @since 15/05/2013
 */
@Permission(profile = { Perfil.ADMINISTRADOR })
@SessionScoped
@ManagedBean
public class NoticiaAdminMB extends BaseMB {

	private static final long serialVersionUID = 1L;

	public static final String ROUTE = "noticia.xhtml";
	
	private NoticiaBean noticiaBean;
	private FonteBean fonteNew;
	
	@ManagedProperty("#{userSession}")
	private UserSession userSession;

	private List<NoticiaBean> noticiaBeans;
	private List<CategoriaBean> categoriaBeans;

	public NoticiaAdminMB() {
		limpar();
	}

	public void limpar() {
		noticiaBean = new NoticiaBean();
		noticiaBeans = new ArrayList<NoticiaBean>();
		noticiaBean.setCategoria(new CategoriaBean());
		fonteNew = getFonteservice().buscaPorNome(new FonteBean(Constantes.DESCRICAO_FONTE_VARIUS));
		categoriaBeans = getCategoriaService().categoriasAtivas();
	}
	
	public void buscar(){
		if (fonteNew.getIdFonte() != null && fonteNew.getIdFonte() != 0) {
			noticiaBean.setFonte(fonteNew);
			noticiaBeans = getNoticia().findByExample(noticiaBean);
			
			if (noticiaBeans.size() == 0) {
				addInfoMessage("formCadastroNoticia", "Nenhuma notícia encontrada");
			}
		} else {
			addInfoMessage("formCadastroNoticia", "A Fonte Various News não está cadastrada no sistema. Favor informar ao Administrador!");
		}
	}
	
	public void salvar(){
		if (validaNoticia(noticiaBean)) {
			noticiaBean.setFonte(fonteNew);
			noticiaBean.setUsuario(userSession.getUsuarioBean());
			String retorno = "";
			
			if (noticiaBean.getIdNoticia() != null && noticiaBean.getIdNoticia()>0) {
				retorno = getNoticia().update(noticiaBean);
			} else {
				retorno = getNoticia().salvar(noticiaBean);
			}
			
			addInfoMessage("formCadastroNoticia", retorno);
			if (retorno.contains("Sucesso")) {
				limpar();
			}
		}
	}
	
	/**
	 * Upload anexo
	 * 
	 * */
	public void anexar(FileUploadEvent event) throws Exception {
		UploadedFile item = event.getUploadedFile();
		noticiaBean.setTamanhoImagem(item.getData().length);
		noticiaBean.setImagem(item.getName());
		noticiaBean.setArquivoImagem(item.getData());
	}
	
	public void deletarAnexo(){
		noticiaBean.setTamanhoImagem(null);
		noticiaBean.setImagem(null);
		noticiaBean.setArquivoImagem(null);
	}
	
	/**
	 * Download de anexo
	 */
	public final void downloadArquivoListener() {
		try {
			if (mostraImagem()) {

				// MONTA O OBJETO PARA O DOWNLOAD
				ObjetoDownload objetoDownload = new ObjetoDownload(noticiaBean.getImagem().substring(noticiaBean.getImagem().lastIndexOf(".") + 1),
						noticiaBean.getImagem(), noticiaBean.getArquivoImagem());

				// REDIRECIONA PARA DOWNLOAD

				FacesContext facesContext = FacesContext.getCurrentInstance();

				ExternalContext context = facesContext.getExternalContext();

				HttpServletResponse response = (HttpServletResponse) context.getResponse();

				HttpServletRequest request = (HttpServletRequest) context.getRequest();

				request.getSession().setAttribute("ObjetoDownload", objetoDownload);

				response.sendRedirect(facesContext.getExternalContext().getRequestContextPath() + "/ServletDownload");

				facesContext.responseComplete();

			} else {
				addErrorMessage("formCadastroNoticia", "Não à imagem cadastrada!");
			}

		} catch (IOException e) {
			Logger.getLogger(NoticiaAdminMB.class).error(e.getMessage(), e);
			addErrorMessage("formCadastroNoticia", "Não foi possivel baixar o anexo!");
		}
	}
	
	public boolean validaNoticia(NoticiaBean noticiaBean){
		boolean valida = true;
		
		if (noticiaBean.getDataNoticia() == null) {
			addErrorMessage("formCadastroNoticia", "A data da noticia deve ser preenchida!");
			valida = false;
		}
		
		if (noticiaBean.getTexto() == null || noticiaBean.getTexto().length() < 1) {
			addErrorMessage("formCadastroNoticia", "O texto deve ser preenchido!");
			valida = false;
		}
		
		if (noticiaBean.getTitulo() == null || noticiaBean.getTitulo().length() < 1) {
			addErrorMessage("formCadastroNoticia", "O Titulo deve ser preenchido!");
			valida = false;
		}
		
		if (noticiaBean.getCategoria() == null || (noticiaBean.getCategoria().getIdCategoria() == null || 
				noticiaBean.getCategoria().getIdCategoria() < 1)) {
			addErrorMessage("formCadastroNoticia", "Selecione alguma categoria!");
			valida = false;
		}
		
		if (fonteNew.getIdFonte() == null || fonteNew.getIdFonte() < 1) {
			addErrorMessage("formCadastroNoticia", "A Fonte Various News não está cadastrada no sistema. Favor informar ao Administrador!");
			valida = false;
		}
		
		return valida;
	}
	
	public boolean mostraImagem(){
		if (noticiaBean.getImagem() != null && !noticiaBean.getImagem().isEmpty()) {
			return true;
		} else {
			return false;
		}
	}
	
	public void editar(NoticiaBean noticiaBean){
		this.noticiaBean = noticiaBean;
	}
	
	public NoticiaBean getNoticiaBean() {
		return noticiaBean;
	}

	public void setNoticiaBean(NoticiaBean noticiaBean) {
		this.noticiaBean = noticiaBean;
	}

	public List<NoticiaBean> getNoticiaBeans() {
		return noticiaBeans;
	}

	public void setNoticiaBeans(List<NoticiaBean> noticiaBeans) {
		this.noticiaBeans = noticiaBeans;
	}

	public FonteBean getFonteNew() {
		if (fonteNew == null) 
			fonteNew = new FonteBean();
		return fonteNew;
	}

	public void setFonteNew(FonteBean fonteNew) {
		this.fonteNew = fonteNew;
	}

	public List<CategoriaBean> getCategoriaBeans() {
		return categoriaBeans;
	}

	public void setCategoriaBeans(List<CategoriaBean> categoriaBeans) {
		this.categoriaBeans = categoriaBeans;
	}

	public UserSession getUserSession() {
		return userSession;
	}

	public void setUserSession(UserSession userSession) {
		this.userSession = userSession;
	}

}
